﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Text.RegularExpressions;

namespace tpsmi1002
{
    public partial class frmAjoutTransaction : Form
    {
        Stock selectedStock;
        ListView lvTransactions;
        int activeErrorProviders; // compteur pour connaitre combien d'error providers sont toujours visible

        public frmAjoutTransaction(ListView _lv)
        {
            InitializeComponent();
            lvTransactions = _lv;
            this.activeErrorProviders = 0;
        }

        public void setSelectedStock(Stock _stock)
        {
            this.selectedStock = _stock;
            txtSymbole.Text = selectedStock.Symbol;
        }

        // trigger du bouton de recherche de transaction
        private void button1_Click(object sender, EventArgs e)
        {
            frmRechercheAction frm = new frmRechercheAction(this);
            frm.Show();
        }

        // trigger du bouton enregistrer
        private void btnAjouterTransaction_Click(object sender, EventArgs e)
        {
            if (this.activeErrorProviders == 0)
                Controller.saveNewTransaction((Stock)selectedStock, (DateTime)dtpDateAchat.Value, int.Parse(txtQuantite.Text), double.Parse(txtPrixAchat.Text, CultureInfo.InvariantCulture));

            MessageBox.Show("La transaction a bien été ajoutée!", "Succès", MessageBoxButtons.OK);
            Controller.loadListTransactions(lvTransactions);
            this.Close();
        }

        // trigger du bouton annuler
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        // trigger de validation sur txtSymbole
        private void txtSymbole_TextChanged(object sender, EventArgs e)
        {
            if (IsSymbolValid())
            {
                epSymbole.Clear();
                SetNbrVisibleEP(-1);
            }
            else
            {
                epSymbole.SetError(txtSymbole, "La symbole entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // trigger de validation sur datetimepicker de date d'achat
        private void dtpDateAchat_Validating(object sender, CancelEventArgs e)
        {
            if (IsDateValid())
            {
                epDate.Clear();
                SetNbrVisibleEP(-1);
            }
            else
            {
                epDate.SetError(dtpDateAchat, "La date entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // trigger de validation sur textbox de quantite
        private void txtQuantite_Validated(object sender, EventArgs e)
        {
            if (IsQuantityValid())
            {
                epQuantite.Clear();
                SetNbrVisibleEP(-1);
            }
            else
            {
                epQuantite.SetError(txtQuantite, "La quantité entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // trigger de validation sur textbox de prix d'achat
        private void txtPrixAchat_Validated(object sender, EventArgs e)
        {
            if (IsPriceValid())
            {
                epPrix.Clear();
                SetNbrVisibleEP(-1);
            }
            else 
            {
                epPrix.SetError(txtPrixAchat, "Le prix entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        private bool IsSymbolValid()
        {
            if (txtSymbole.Text == "")
                return false;

            if (selectedStock == null)
                return false;

            return true;
        }

        private bool IsDateValid()
        {
            return (dtpDateAchat.Value <= DateTime.Now);
        }

        private bool IsPriceValid()
        {
            var regex = @"^\d{0,5}(\.\d{0,2})?$";
            
            if (txtPrixAchat.Text == "")
                return false;

            if (!Regex.IsMatch(txtPrixAchat.Text, regex))
                return false;

            double prix = double.Parse(txtPrixAchat.Text, CultureInfo.InvariantCulture);
            if (prix <= 0.00)
                return false;

            return true;
        }

        private bool IsQuantityValid()
        {
            var regex = @"^[0-9]{0,6}$";
            
            if (txtQuantite.Text == "")
                return false;

            if (!Regex.IsMatch(txtQuantite.Text, regex))
                return false;

            if (int.Parse(txtQuantite.Text) <= 0)
                return false;

            return true;
        }

        // fonction qui sert a connaitre le nombre d'error provider toujours visible sur la fenetre, cad qu'il y a des donnees non-valide
        private void SetNbrVisibleEP(int i)
        {
            if (i == 1)
                this.activeErrorProviders++;
            else if (i == -1 && this.activeErrorProviders > 0)
                this.activeErrorProviders--;
        }
    }
}
